#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

/**
标准输入输出流 （File *）
    FILE *stdin;   标准输入
    FILE *stdout;  标准输出
    FILE *stderr;  标准错误输出
标准输出输出流的文件描述符
    STDIN_FILENO    0  标准输入
    STDOUT_FILENO   1  标准输出
    STDERR_FILENO   2  标准错误输出
 */
int main(int argc, char const *argv[])
{
    // 重定向标准输入输出流
    close(STDOUT_FILENO);
    close(STDERR_FILENO);

    // open("out.log", O_CREAT | O_WRONLY, 0644);
    // open("err.log", O_CREAT | O_WRONLY, 0644);
    open("out.log", O_CREAT | O_WRONLY | O_APPEND, 0644);
    open("err.log", O_CREAT | O_WRONLY | O_APPEND, 0644);

    // 标准输入输出
    char f_buf[1024];
    char *fin_buf = "利用stdout 来实现标准输出 \n";
    char *ferr_buf = "利用stderr 来实现标准错误输出 \n";
    // 利用stdin 来实现标准输入
    fgets(f_buf, sizeof(f_buf), stdin);
    printf("标准输入输出流_输入的数据：%s", f_buf);
    // 利用stdout 来实现标准输出
    fputs(fin_buf, stdout);
    // 利用stderr 来实现标准错误输出
    fputs(ferr_buf, stderr);

    // 标准输出输出流的文件描述符
    char buf[1024];
    char *out_buf = "利用STDOUT_FILENO 来实现标准输出 \n";
    char *err_buf = "利用STDERR_FILENO 来实现标准错误输出 \n";
    // 利用STDIN_FILENO 来实现标准输入
    ssize_t len = read(STDIN_FILENO, buf, strlen(buf));
    printf("标准输出输出流的文件描述符_输入的数据：%.*s", (int)len, buf);
    // 利用STDOUT_FILENO 来实现标准输出
    write(STDOUT_FILENO, out_buf, strlen(out_buf));
    // 利用STDERR_FILENO 来实现标准错误输出
    write(STDERR_FILENO, err_buf, strlen(err_buf));

    return 0;
}
